package bz.ziro.kanbe.controller.file;

import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

import javax.servlet.http.HttpSession;

import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;
import org.slim3.controller.upload.FileItem;
import org.slim3.datastore.Datastore;

import bz.ziro.kanbe.bean.FileData;
import bz.ziro.kanbe.model.SiteFile;

import com.google.appengine.repackaged.com.google.common.base.StringUtil;

/**
 * ファイルアップロード用の共通コントローラー<br>
 * Flex側のFileReferenceから認証できないので<br>
 * 認証外にしている<br>
 * セッションIDをFlex側から送っているのと、セッションを一応確認している
 * @author Administrator
 */
public abstract class FileUploadController extends Controller {

    @SuppressWarnings("unused")
    private static final Logger logger = Logger.getLogger(UpdateController.class.getName());

    /**
     * 拡張子マップ
     */
    private static final Map<String,String> extMap = new HashMap<String,String>();
    static {
        extMap.put(".css", "text/css");
        extMap.put(".js",  "text/javascript");
        extMap.put(".htc", "text/x-component");

        extMap.put(".txt", "text/plain");
        extMap.put(".html","text/html");
        extMap.put(".htm", "text/html");
        extMap.put(".xml", "text/xml");
        extMap.put(".vbs", "text/vbscript");
        extMap.put(".gif", "image/gif");
        extMap.put(".jpg", "image/jpeg");
        extMap.put(".jpeg","image/jpeg");
        extMap.put(".png", "image/png");

        extMap.put(".swf", "application/x-shockwave-flash");
        extMap.put(".pdf", "application/pdf");
    }

    @Override
    protected Navigation run() {
        String jsessionId = requestScope("jsessionid");
        //指定のセッションIDが空の場合
        if ( jsessionId == null || jsessionId.equals("") ) {
            return null;
        } else {
            HttpSession session = request.getSession();
            //認証があるのでセッションがないことはない
            if ( session == null ) return null;
        }
        return runFileUpload();
    }
  
    /**
     * ファイルデータの設定
     * @param aFile
     */
    protected void setFileData(SiteFile aFile) {
        //ファイルデータを設定
        copyFile("uploadFile",aFile);
        //Mimeを解析
        setMime(aFile);
        //トランザクション込で更新
        Datastore.put(aFile);
        //マップを再検索
        FileData.refreshFileMap();
    }

    /**
     * ファイルのコピー
     * @param aName
     * @param aFile
     */
    private void copyFile(String aName,SiteFile aFile) {
        //ファイルデータを取得
        FileItem file = (FileItem)requestScope(aName);
        //ファイルが存在した場合
        if ( file != null ) {
            //ファイルデータを設定
            aFile.setFile(file.getData());
            //名称が存在しなかった場合
            if ( StringUtil.isEmpty((String)requestScope("name")) ) {
                //ファイル名から名称を付ける
                aFile.setName(file.getFileName());
            }
        }
    }

    /**
     * 独自処理
     * @return
     */
    protected abstract Navigation runFileUpload();

    /**
     * MIMEの設定
     * @param file
     */
	private void setMime(SiteFile file) {
		
		String type = file.getType();
		//設定が存在しない場合
		if ( type == null || type.equals("") ) {
			return;
		}
		String mime = file.getMime();
		//すでに設定がある場合
		if ( mime != null && !mime.equals("") ) {
			return;
		}
		
		String lowType = type.toLowerCase();
		//MIMEが存在した場合
		String defaultMime = extMap.get(lowType);
		if ( defaultMime != null && !defaultMime.equals("") ) {
			file.setMime(defaultMime);
		}
	}
}
